package com.example.fastjson.config;

import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
import com.alibaba.fastjson2.support.spring6.webservlet.view.FastJsonJsonView;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    // 在 Spring Web MVC 中集成 Fastjson2
    // 配置参考 FastJson2 在 Github上 的文档 https://github.com/alibaba/fastjson2/blob/main/docs/spring_support_cn.md

    // 使用 FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化和反序列化速度。
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //自定义配置...
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(StandardCharsets.UTF_8);
        config.setDateFormat("yyyy-MM-dd HH:mm:ss");
        config.setReaderFeatures(JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean);
        config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat);
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        converters.addFirst(converter);
    }

    // 使用 FastJsonJsonView 来设置 Spring MVC 默认的视图模型解析器，以提高 @Controller @ResponseBody ModelAndView JSON序列化速度。
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        FastJsonJsonView fastJsonJsonView = new FastJsonJsonView();
        // 自定义配置...
        // FastJsonConfig config = new FastJsonConfig();
        // config.set...
        // fastJsonJsonView.setFastJsonConfig(config);
        registry.enableContentNegotiation(fastJsonJsonView);
    }
}

/*
完全接管 Spring Web MVC 的配置：在这种情况下，你需要使用 @EnableWebMvc 注解，并提供自己的配置类来完全替换 Spring Web MVC 的默认配置。
部分覆盖默认配置：如果你只想覆盖部分默认配置，而不希望完全接管 Spring Web MVC 的配置，则不需要使用 @EnableWebMvc 注解。


2. 在 Spring Web MVC 中集成 Fastjson2
在Fastjson2中，同样可以使用FastJsonHttpMessageConverter 和 FastJsonJsonView 为 Spring MVC 构建的 Web 应用提供更好的性能体验。
使用 FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化和反序列化速度。
*/


/*
在 IntelliJ IDEA 中，你可以使用快捷键来快速生成方法重写或覆盖的代码。以下是不同操作系统下的快捷键：
    Windows/Linux:
        重写/覆盖方法: Ctrl + O
        生成方法签名提示: Ctrl + Shift + N (这可以用来快速定位到类或方法)
        生成代码模板: Ctrl + Alt + Insert (或 Ctrl + N)
*/